class Animals{
    public String name;
    public int age;
    public String color;

    static {
        System.out.println("Animals的一个静态代码块");
    }

    {
        System.out.println("Animals的一个实例代码块");
    }
    public Animals(String name) {
        this.name = name;
        System.out.println("Animals(String)");
    }

    public void eat(){
        System.out.println(this.name + " 正在吃饭！！");
    }
}
class Dog extends Animals{
    static {
        System.out.println("Dog的一个静态代码块");
    }

    {
        System.out.println("Dog的一个实例代码块");
    }
    public Dog(String name) {
        super(name);
        System.out.println("Dog的一个构造方法");
    }
    public void wangWang(){
        System.out.println(this.name + "正在汪汪叫！！");
    }
}
class Cat extends Animals{
    public Cat(String name) {
        super(name);
    }
    public void miMi(){
        System.out.println(this.name + "正在喵喵叫！！");
    }
}
public class Test {
    public static void main(String[] args) {
        Dog dog1 = new Dog("小狗1");
        System.out.println("===============");
        Dog dog2 = new Dog("小狗2");
        //静态代码块先执行，先父后子，其余的是先执行父类的实例代码块和构造方法，再去执行子类的实例代码块和构造方法。
    }
     //代码初始化复习一下：
     public static void main2(String[] args) {
         Animals animals = new Animals("Animals");
         System.out.println("===========================");
         Animals animals1 = new Animals("Animals");
     }

    public static void main1(String[] args) {
         Dog dog = new Dog("小狗");
         dog.eat();
         dog.wangWang();
         System.out.println("===============");
         Cat cat = new Cat("小猫");
         cat.eat();
         cat.miMi();
    }
    //通过分析执行结果，得出以下结论：
    //1、父类静态代码块优先于子类静态代码块执行，且是最早执行
    //2、父类实例代码块和父类构造方法紧接着执行
    //3、子类的实例代码块和子类构造方法紧接着再执行
    //4、第二次实例化子类对象时，父类和子类的静态代码块都将不会再执行

    
}
